/** @file gui_label.cpp
    @brief A label widget */

#include "gui/gui_label.h"

//==============================================================================
// Constructors
//==============================================================================
G3::GUI::LABEL::LABEL () {
    Font = NULL;
    ClippedByRect = false;
    Color = COL4F (1, 1, 1, 1);
}

//==============================================================================
// Destructors
//==============================================================================

// Just chill?

//==============================================================================
// = operators
//==============================================================================
G3::GUI::LABEL& G3::GUI::LABEL::operator= (const LABEL &aLabel) {
    Visible = aLabel.Visible;
    Rect = aLabel.Rect;
    ClippedByRect = aLabel.ClippedByRect;
    Children = aLabel.Children;

    Font = aLabel.Font;
    Color = aLabel.Color;
    Value = aLabel.Value;

    return *this;
}

//==============================================================================
// Creates the label
//==============================================================================
void G3::GUI::LABEL::Create (const VEC2I &aPosition, FONT *aFont) {
    SetPosition (aPosition);
    AttachFont (aFont);
}

//==============================================================================
// Shrinks the label to its contents
//==============================================================================
void G3::GUI::LABEL::Shrink () {
    if (Font) {
        Rect.Right = G3_MAX (Rect.Left + (int) Font->CalcTextWidth (Value), Rect.Right);
        Rect.Bottom = G3_MAX (Rect.Top + Font->Height, Rect.Bottom);
    } else {
        Rect.Right = Rect.Left;
        Rect.Bottom = Rect.Top;
    }
}

//==============================================================================
// Attaches a font to the label
//==============================================================================
void G3::GUI::LABEL::AttachFont (G3::FONT *aFont) {
    Font = aFont;
    Shrink ();
}

//==============================================================================
// Sets label value
//==============================================================================
void G3::GUI::LABEL::SetValue (const string &aValue) {
    if (ClippedByRect) {
        Assert (Font, "LABEL::Draw: Font member is a NULL pointer");
        Value = Font->ClipTextRight (aValue, Rect.Right - Rect.Left);
    } else {
        Value = aValue;
        Shrink ();
    }
}

//==============================================================================
// Prints to label value
//==============================================================================
void G3::GUI::LABEL::Print (const char *aFormat, ...) {
    char		text [1024];
    va_list		ap;

    Assert (aFormat, "LABEL::Print Format argument is a NULL pointer");

    va_start (ap, aFormat);
    vsprintf (text, aFormat, ap);
    va_end (ap);

    SetValue ((string) text);
}

//==============================================================================
// Draws the label
//==============================================================================
void G3::GUI::LABEL::Draw (float aElapsedTime) {
    if (!Visible)
        return;

    Assert (Font, "LABEL::Draw: Font member is a NULL pointer");

    if (!Font->IsBuilt ())
        return;

    glPushMatrix ();

    glBlendFunc (GL_SRC_ALPHA, GL_ONE);

    glEnable (GL_BLEND);
    glEnable (GL_TEXTURE_2D);
    TextureManager.Apply (Font->Texture);
    // Label position
    glTranslated (Rect.Left, -Rect.Top - Font->Height, 0);
    // Label text color
    glColor4f (Color.r, Color.g, Color.b, Color.a);
    // Renders the value
    Font->DrawTextBuffer (Value);
    glDisable (GL_TEXTURE_2D);
    glDisable (GL_BLEND);

    glPopMatrix ();
}
